热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

发生|都会_AOP面向切面编程(个人笔记1.1)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AOP面向切面编程(个人笔记1.1)相关的知识,希望对你有一定的参考价值。AOP面向切面编程

篇首语:本文由编程笔记#小编为大家整理,主要介绍了AOP面向切面编程(个人笔记1.1)相关的知识,希望对你有一定的参考价值。



AOP面向切面编程


  • AOP面向切面编程
    • 存在的实现方式
    • 经典的基于代理的AOP:
    • AspectJ



AOP面向切面编程

AOP(Aspect-Oriented Programming:面向切面编程)将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。


核心概念概述
连接点Joinpoint可以进行切入开发的点。如一个方法、一个代码块、一个try块(AspectJ中原本规定可以有这些)。但是spring只支持把方法作为连接点。
切入点Pointcut已经被选定作为切面开发的点。
通知/增强Advice对切入点可以做的各种事情。如前置通知before()、后置通知after()、环绕通知around()、异常通知exception()等。 java程序中,往往把这些通知放入到一个额外的类中书写。
目标对象Target(略) 目标对象是被切入的对象。但是由于类是对象的模板,是由类new()出来的,所以目标当然就是一个个的类了。
代理对象Proxy(略)由于本章节,是spring自行内在完成代理对象的所有工作,我们只管用就好,所以不必专门学习。如果要知道原理请学习动态代理。
切面Aspect切入点被融入通知后,产生的整体效应。(不必强行理解这个词)
引入(Introduction)引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)
织入(Weaving)把切面应用到目标对象来创建新的代理对象的过程,织入一般发生在如下几个时机:
(1)编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器

(2)类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码

(3)运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,原理应该是使用了JDK的动态代理技术

存在的实现方式

1.经典的基于代理的AOP
2.@AspectJ注解驱动的切面
3.纯POJO切面
4.注入式AspectJ切面


经典的基于代理的AOP:

Spring支持五种类型的通知:
Before(前) org.apringframework.aop.MethodBeforeAdvice
After-returning(返回后) org.springframework.aop.AfterReturningAdvice
After-throwing(抛出后) org.springframework.aop.ThrowsAdvice
Arround(周围) org.aopaliance.intercept.MethodInterceptor
Introduction(引入) org.springframework.aop.IntroductionInterceptor

AOP一共有两大写法,都适用于web项目


AspectJ

下载必备jar包:

java的通知都写在一个类中,其中的方法就是“通知”。可以切入到目标对象。spring支持的通知如下

1、前置通知:在目标方法之前调用

2、后置通知:(如果出现异常就不调用):在目标方法之后调用

3、后置通知:(无论是否出现异常都会调用):在目标方法之后调用

4、环绕通知:在目标方法之前、后调用

5、异常通知:出现异常时就调用

package com.qq.model;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* @description:com.qq.model_studyAOP
* @author: 霏宇
* @time: 2022/7/27,15:34
*/

public class DoorAdvice
void before()
System.out.println("before()");

void after()
System.out.println("after()");

void after_returning()
System.out.println("after_returning");

void after_throwing()
System.out.println("发生异常");

void around(ProceedingJoinPoint point) throws Throwable
System.out.println("环绕通知!!!!!!");
point.proceed();
System.out.println("环绕通知2!!!!!!");


将通知织入到目标对象

先在xml文件加入aop名称空间


<beans xmlns&#61;"http://www.springframework.org/schema/beans"
xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context&#61;"http://www.springframework.org/schema/context"
xmlns:aop&#61;"http://www.springframework.org/schema/aop"
xsi:schemaLocation&#61;"
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
"
>

xmlns:aop&#61;"http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

再配置目标对象、通知对象、织入配置。共有两种写法方式&#xff08;1&#xff09;xml配置&#xff08;2&#xff09;注解配置

方法一&#xff1a;纯xml配置方式

<bean class&#61;"com.qq.model.Person"/>

<bean id&#61;"doorAdvice" class&#61;"com.qq.model.DoorAdvice"/>
<aop:config>

<aop:pointcut id&#61;"enter" expression&#61;"execution(public void com.qq.model.Person.enter())"/>
<aop:aspect ref&#61;"doorAdvice"> //正因为这里的ref所以使通知对象能起作用
<aop:before method&#61;"before" pointcut-ref&#61;"enter"/>
<aop:after method&#61;"after" pointcut-ref&#61;"enter" />
<aop:after-returning method&#61;"after_returning" pointcut-ref&#61;"enter"/>
<aop:after-throwing method&#61;"after_throwing" pointcut-ref&#61;"enter"/>
<aop:around method&#61;"around" pointcut-ref&#61;"enter"/>
aop:aspect>
aop:config>

方法二&#xff1a;注解配置方式&#xff1a;

在xml文件中必须加上这句来开启注解&#xff1a;

<aop:aspectj-autoproxy/>

在通知类中进行织入的配置:


  1. 类上加&#64;Aspect注解:

  2. 在类中指定切入点&#64;Pointcut(“execution(…)”)&#xff0c;标在一个空方法上面

  3. 指定各种通知方法&#xff0c;即在各个方法上标注&#64;Before 、&#64;After 、&#64;Around等等&#xff0c;并添加

    package com.qq.model;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    /**
    * &#64;description:com.qq.model_studyAOP
    * &#64;author: 霏宇
    * &#64;time: 2022/7/27,15:34
    */

    //通知类
    &#64;Aspect
    public class DoorAdvice
    &#64;Pointcut("execution(public void com.qq.model.Person.enter())")
    void point()

    &#64;Before("DoorAdvice.point()")
    void before()
    System.out.println("before()");

    &#64;After("DoorAdvice.point()")
    void after()
    System.out.println("after()");

    &#64;AfterReturning("DoorAdvice.point()")
    void after_returning()
    System.out.println("after_returning");

    &#64;AfterThrowing("DoorAdvice.point()")
    void after_throwing()
    System.out.println("发生异常");

    &#64;Around("DoorAdvice.point()")
    Object around(ProceedingJoinPoint point) throws Throwable
    System.out.println("环绕通知&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;");
    Object proceed &#61; point.proceed();
    System.out.println("环绕通知2&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;");
    return proceed;


    另外



    通知类也是一个&#xff0c;如果我们不想在xml中书写&#xff0c;也可以改成用注解的方式&#xff0c;即需要做


    1、 使用&#64;component标注通知类


    2、在xml配置文件中用 语句把通知类所在包的路径填进去



推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
qaqa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有